/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import modelo.Venta;
import modelo.Empleado;
import modelo.Pagocliente;
import modelo.PagoclientePK;

/**
 *
 * @author usuario
 */
public class PagoclienteJpaController implements Serializable {

    public PagoclienteJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Pagocliente pagocliente) throws PreexistingEntityException, Exception {
        if (pagocliente.getPagoclientePK() == null) {
            pagocliente.setPagoclientePK(new PagoclientePK());
        }
        pagocliente.getPagoclientePK().setIdventa(pagocliente.getVenta().getIdventa());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Venta venta = pagocliente.getVenta();
            if (venta != null) {
                venta = em.getReference(venta.getClass(), venta.getIdventa());
                pagocliente.setVenta(venta);
            }
            Empleado idempleado = pagocliente.getIdempleado();
            if (idempleado != null) {
                idempleado = em.getReference(idempleado.getClass(), idempleado.getIdempleado());
                pagocliente.setIdempleado(idempleado);
            }
            em.persist(pagocliente);
            if (venta != null) {
                venta.getPagoclienteCollection().add(pagocliente);
                venta = em.merge(venta);
            }
            if (idempleado != null) {
                idempleado.getPagoclienteCollection().add(pagocliente);
                idempleado = em.merge(idempleado);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findPagocliente(pagocliente.getPagoclientePK()) != null) {
                throw new PreexistingEntityException("Pagocliente " + pagocliente + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Pagocliente pagocliente) throws NonexistentEntityException, Exception {
        pagocliente.getPagoclientePK().setIdventa(pagocliente.getVenta().getIdventa());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Pagocliente persistentPagocliente = em.find(Pagocliente.class, pagocliente.getPagoclientePK());
            Venta ventaOld = persistentPagocliente.getVenta();
            Venta ventaNew = pagocliente.getVenta();
            Empleado idempleadoOld = persistentPagocliente.getIdempleado();
            Empleado idempleadoNew = pagocliente.getIdempleado();
            if (ventaNew != null) {
                ventaNew = em.getReference(ventaNew.getClass(), ventaNew.getIdventa());
                pagocliente.setVenta(ventaNew);
            }
            if (idempleadoNew != null) {
                idempleadoNew = em.getReference(idempleadoNew.getClass(), idempleadoNew.getIdempleado());
                pagocliente.setIdempleado(idempleadoNew);
            }
            pagocliente = em.merge(pagocliente);
            if (ventaOld != null && !ventaOld.equals(ventaNew)) {
                ventaOld.getPagoclienteCollection().remove(pagocliente);
                ventaOld = em.merge(ventaOld);
            }
            if (ventaNew != null && !ventaNew.equals(ventaOld)) {
                ventaNew.getPagoclienteCollection().add(pagocliente);
                ventaNew = em.merge(ventaNew);
            }
            if (idempleadoOld != null && !idempleadoOld.equals(idempleadoNew)) {
                idempleadoOld.getPagoclienteCollection().remove(pagocliente);
                idempleadoOld = em.merge(idempleadoOld);
            }
            if (idempleadoNew != null && !idempleadoNew.equals(idempleadoOld)) {
                idempleadoNew.getPagoclienteCollection().add(pagocliente);
                idempleadoNew = em.merge(idempleadoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                PagoclientePK id = pagocliente.getPagoclientePK();
                if (findPagocliente(id) == null) {
                    throw new NonexistentEntityException("The pagocliente with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(PagoclientePK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Pagocliente pagocliente;
            try {
                pagocliente = em.getReference(Pagocliente.class, id);
                pagocliente.getPagoclientePK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The pagocliente with id " + id + " no longer exists.", enfe);
            }
            Venta venta = pagocliente.getVenta();
            if (venta != null) {
                venta.getPagoclienteCollection().remove(pagocliente);
                venta = em.merge(venta);
            }
            Empleado idempleado = pagocliente.getIdempleado();
            if (idempleado != null) {
                idempleado.getPagoclienteCollection().remove(pagocliente);
                idempleado = em.merge(idempleado);
            }
            em.remove(pagocliente);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Pagocliente> findPagoclienteEntities() {
        return findPagoclienteEntities(true, -1, -1);
    }

    public List<Pagocliente> findPagoclienteEntities(int maxResults, int firstResult) {
        return findPagoclienteEntities(false, maxResults, firstResult);
    }

    private List<Pagocliente> findPagoclienteEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Pagocliente.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Pagocliente findPagocliente(PagoclientePK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Pagocliente.class, id);
        } finally {
            em.close();
        }
    }

    public int getPagoclienteCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Pagocliente> rt = cq.from(Pagocliente.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
